
#include "nane/core/crt/LogManagerImpl_.h"
#include <algorithm>

namespace nane
{
    ////////////////////////////////////////////////////////////////////////////
    LogManager::Implementation::Implementation( bool _enableStdLogger )
        : messagesLevel( ELogMessageLevel::Warning )
    {
        if( _enableStdLogger == true )
        {
            RegisterLogger(&stdLogger);
        }        
    }
    ////////////////////////////////////////////////////////////////////////////
    LogManager::Implementation::~Implementation()
    {
        loggers.clear();
    }
    ////////////////////////////////////////////////////////////////////////////
    bool LogManager::Implementation::Initialize()
    {
        return true;
    }
    ////////////////////////////////////////////////////////////////////////////
    void LogManager::Implementation::Shutdown()
    {
        
    }
    ////////////////////////////////////////////////////////////////////////////
    void LogManager::Implementation::RegisterLogger( ILogger* _logger )
    {
        if( _logger != NULL )
        {
            std::vector<ILogger*>::iterator it_find = std::find(loggers.begin(), loggers.end(), _logger);
            if( it_find == loggers.end() )
            {
                loggers.push_back(_logger);
            }
        }
    }
    ////////////////////////////////////////////////////////////////////////////
    void LogManager::Implementation::UnregisterLogger( ILogger* _logger )
    {
        std::vector<ILogger*>::iterator it_find = std::find(loggers.begin(), loggers.end(), _logger);
        if( it_find != loggers.end() )
        {
            loggers.erase(it_find);
        }
    }
    ////////////////////////////////////////////////////////////////////////////
    void LogManager::Implementation::Log( const char* _message
                   , const char* _file, const char* _line, const char* _function, ELogMessageLevel::raw_type _messageLevel )
    {
        if( enum_cast<ELogMessageLevel>(_messageLevel) <= messagesLevel )
        {
            for( std::vector<ILogger*>::iterator it = loggers.begin()
                    , it_end = loggers.end(); it != it_end; ++it )
            {
                (*it)->Log(_message, _file, _line, _function, _messageLevel);
            }
        }
    }
    ////////////////////////////////////////////////////////////////////////////
    void LogManager::Implementation::SetMessagesLevel( ELogMessageLevel::raw_type _messagesLevel )
    {
        if( enum_cast<ELogMessageLevel>(_messagesLevel) < ELogMessageLevel::_max )
        {
            messagesLevel = enum_cast<ELogMessageLevel>(_messagesLevel);
        }
    }
    ////////////////////////////////////////////////////////////////////////////
}   // namespace nane
